package com.it.schoolbookshop_back.controller;

import com.it.schoolbookshop_back.entities.po.Category;
import com.it.schoolbookshop_back.entities.po.Result;
import com.it.schoolbookshop_back.service.CategoryService;
import com.it.schoolbookshop_back.utils.UserContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 分类管理控制器
 */
@RestController
@RequestMapping("/api/categories")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;
    
    /**
     * 获取所有分类列表
     * @return 分类列表
     */
    @GetMapping
    public Result<List<Category>> getAllCategories() {
        List<Category> categories = categoryService.getAllCategories();
        return Result.success(categories);
    }
    
    /**
     * 获取指定分类详情
     * @param id 分类ID
     * @return 分类详情
     */
    @GetMapping("/{id}")
    public Result<Category> getCategoryById(@PathVariable Integer id) {
        Category category = categoryService.getCategoryById(id);
        if (category == null) {
            return Result.failed("分类不存在");
        }
        return Result.success(category);
    }
    
    /**
     * 创建新分类（需要管理员权限）
     * @param category 分类信息
     * @return 创建结果
     */
    @PostMapping
    public Result<Category> createCategory(@RequestBody Category category) {
        // 检查权限
        String role = UserContext.getRole();
        if (!"admin".equals(role)) {
            return Result.failed(403, "权限不足，仅管理员可创建分类");
        }
        
        // 参数校验
        if (category.getName() == null || category.getName().trim().isEmpty()) {
            return Result.validateFailed("分类名称不能为空");
        }
        
        // 检查分类名称是否已存在
        if (categoryService.isCategoryNameExists(category.getName())) {
            return Result.validateFailed("分类名称已存在");
        }
        
        // 执行创建
        Integer categoryId = categoryService.createCategory(category);
        if (categoryId == null) {
            return Result.failed("创建分类失败");
        }
        
        // 返回创建的分类
        Category newCategory = categoryService.getCategoryById(categoryId);
        return Result.success("创建分类成功", newCategory);
    }
    
    /**
     * 更新分类信息（需要管理员权限）
     * @param id 分类ID
     * @param categoryUpdate 要更新的分类信息
     * @return 更新结果
     */
    @PutMapping("/{id}")
    public Result<Category> updateCategory(@PathVariable Integer id, @RequestBody Category categoryUpdate) {
        // 检查权限
        String role = UserContext.getRole();
        if (!"admin".equals(role)) {
            return Result.failed(403, "权限不足，仅管理员可更新分类");
        }
        
        // 检查分类是否存在
        Category existingCategory = categoryService.getCategoryById(id);
        if (existingCategory == null) {
            return Result.failed("分类不存在");
        }
        
        // 参数校验
        if (categoryUpdate.getName() == null || categoryUpdate.getName().trim().isEmpty()) {
            return Result.validateFailed("分类名称不能为空");
        }
        
        // 检查分类名称是否已被其他分类使用
        if (categoryService.isCategoryNameExists(categoryUpdate.getName(), id)) {
            return Result.validateFailed("分类名称已被其他分类使用");
        }
        
        // 设置ID
        categoryUpdate.setId(id);
        
        // 执行更新
        boolean success = categoryService.updateCategory(categoryUpdate);
        if (!success) {
            return Result.failed("更新分类失败");
        }
        
        // 返回更新后的分类
        Category updatedCategory = categoryService.getCategoryById(id);
        return Result.success("更新分类成功", updatedCategory);
    }
    
    /**
     * 删除分类（需要管理员权限）
     * @param id 分类ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public Result<String> deleteCategory(@PathVariable Integer id) {
        // 检查权限
        String role = UserContext.getRole();
        if (!"admin".equals(role)) {
            return Result.failed(403, "权限不足，仅管理员可删除分类");
        }
        
        // 检查分类是否存在
        Category category = categoryService.getCategoryById(id);
        if (category == null) {
            return Result.failed("分类不存在");
        }
        
        // 执行删除
        boolean success = categoryService.deleteCategory(id);
        if (!success) {
            return Result.failed("删除分类失败");
        }
        
        return Result.success("删除分类成功");
    }
} 